package org.zoomdev.zoom.dao;

/**
 * 生成entity
 * 字段来源于 table表和 type的内部标注
 * <p>
 * 其中bind的作用为"修正"绑定关系，如果使用默认绑定关系，则无需指定
 *
 * <pre>
 *  EntityBuilder builder = dao.entityBuilder();
 *  Entity entity = builder.setType(User.class).setTable("user").bind("id","user_id").build();
 *  User user = dao.ar(entity).get(1);
 * </pre>
 * <p>
 * 如果User内部含有多张表的字段:
 * <pre>
 *    EntityBuilder builder = dao.entityBuilder();
 *    Entity entity = builder.setType(User.class).setTable("user")
 *      .bind("id","user_id")
 *      .bind("group_id","group.id").build();
 *    User user = dao.ar(entity).get(1);
 * </pre>
 */
public interface EntityBuilder {
    EntityBuilder setType(Class<?> type);

    /**
     * 第一张表为默认表，其他为关联表
     *
     * <pre>
     * 若指定的实体类类型中含有 @Column且，@Column指定了其他表  @Column("admin.id") ,则可以使用如下格式:
     *
     * setTable("user","admin:admin1")
     * admin:admin1 表示将  @Column("admin.id") 中的admin表替换为admin1表
     *
     * </pre>
     *
     * @param table
     * @return
     */
    EntityBuilder setTable(String... table);

    /**
     * 增加实体类字段与数据库字段的绑定关系
     * class User{
     * String name;
     * }
     * <p>
     * bind("name", "name")
     * bind("name", "user1.name")
     *
     * @param field  bean字段
     * @param column 数据库字段
     * @return
     */
    EntityBuilder bind(String field, String column);

    Entity build();

}

